package com.link.base.base.crowd.service;

import com.link.base.base.consumer.model.PortalAccntTagGroup;
import com.link.base.base.consumer.model.PortalAccntTagItem;
import com.link.base.base.consumer.service.PortalAccntTagGroupService;
import com.link.base.base.consumer.service.PortalAccntTagItemService;
import com.link.base.base.crowd.model.CrowdTag;
import com.link.core.basic.model.BasicModel;
import com.link.core.basic.query.QueryParams;
import com.link.core.basic.service.BasicServiceImpl;
import com.link.core.util.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 人群圈选模块：消费者标签
 *
 * @author 何启谦
 * @date 2019-1-29
 */
@Service
public class CrowdTagServiceImpl extends BasicServiceImpl<CrowdTag> implements CrowdTagService {

    @Resource
    private PortalAccntTagGroupService portalAccntTagGroupService;
    @Resource
    private PortalAccntTagItemService portalAccntTagItemService;

    @Override
    public List<CrowdTag> queryTags() throws Exception {
        List<CrowdTag> tags = new ArrayList<CrowdTag>();
        //获取一级标签List
        PortalAccntTagGroup record = new PortalAccntTagGroup();
//        record.setLoginCorpId(000);
        List<String> fstTags = portalAccntTagGroupService.queryFstTags(record);
        //获取所有二级标签
        List<PortalAccntTagGroup> allSecTags = queryAllSecTags();
        List<PortalAccntTagItem> allTrdTags = queryAllTrdTags();
        //获取所有三级标签
        for (String tagName : fstTags) {
            if (StringUtils.isBlank(tagName)) {
                continue;
            }
            CrowdTag fstTag = new CrowdTag();
            fstTag.setTagName(tagName);
            List<CrowdTag> secTags = popSecTags(fstTag.getTagName(), allSecTags);
            for (CrowdTag secTag : secTags) {
                List<CrowdTag> trdTags = popTrdTags(secTag.getId(), allTrdTags);
                secTag.setSubTags(trdTags);
            }
            fstTag.setSubTags(secTags);
            tags.add(fstTag);
        }
        return tags;
    }

    /**
     * 查询所有二级标签
     *
     * @return 二级标签List
     * @throws Exception 数据库异常
     * @date 2019-1-29
     */
    private List<PortalAccntTagGroup> queryAllSecTags() throws Exception {
        PortalAccntTagGroup example = new PortalAccntTagGroup();
        example.setPageFlag(false);
        return portalAccntTagGroupService.queryByExamplePage(example);
    }

    /**
     * 根据一级标签名称，从指定的二级标签List中弹出属于该一级标签的子标签
     *
     * @param fstTagName 一级标签名称
     * @param secTags    待搜索的二级标签List
     * @return 二级标签List
     * @date 2019-1-29
     */
    private List<CrowdTag> popSecTags(String fstTagName, List<PortalAccntTagGroup> secTags) {
        List<CrowdTag> list = new ArrayList<>();
        Iterator<PortalAccntTagGroup> iter = secTags.iterator();
        while (iter.hasNext()) {
            PortalAccntTagGroup tag = iter.next();
            if (!StringUtils.equals(tag.getTagGroupSec(), fstTagName)) {
                continue;
            }
            CrowdTag crowdTag = new CrowdTag();
            crowdTag.setId(tag.getId());
            crowdTag.setTagName(tag.getTagGroupName());
            list.add(crowdTag);
            iter.remove();
        }
        return list;
    }

    /**
     * 查询所有三级标签
     *
     * @return 三级标签List
     * @throws Exception 数据库异常
     * @date 2019-1-29
     */
    private List<PortalAccntTagItem> queryAllTrdTags() throws Exception {
        QueryParams qps = new QueryParams();
        qps.setSort("sort");
        qps.setOrder("ASC");
        qps.setPageFlag(false);
        PortalAccntTagItem example = (PortalAccntTagItem) BasicModel.transformClass(PortalAccntTagItem.class, qps);
        return portalAccntTagItemService.queryByExamplePage(example);
    }

    /**
     * 根据二级标签ID，从指定的二级标签List中弹出属于该三级标签的子标签
     *
     * @param secTagId 二级标签ID
     * @param trdTags  待搜索的三级标签List
     * @return 三级标签List
     * @date 2019-1-29
     */
    private List<CrowdTag> popTrdTags(Long secTagId, List<PortalAccntTagItem> trdTags) {
        List<CrowdTag> list = new ArrayList<>();
        Iterator<PortalAccntTagItem> iter = trdTags.iterator();
        while (iter.hasNext()) {
            PortalAccntTagItem tag = iter.next();
            if (!secTagId.equals(tag.getHeadId())) {
                continue;
            }
            CrowdTag crowdTag = new CrowdTag();
            crowdTag.setId(tag.getId());
            crowdTag.setTagName(tag.getTagName());
            crowdTag.setIntervalType(tag.getIntervalType());
            crowdTag.setItemType(tag.getItemType());
            list.add(crowdTag);
            iter.remove();
        }
        return list;
    }

    //将营销活动做为一种标签来查询
    //private
}
